﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Joel.Vishnu.Presentacion.Vistas;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Modelo.Enumeradores;
using Joel.Vishnu.Repositorios;

namespace Joel.Vishnu.Presentacion
{
    public class ProductoSubCategoriasPresentador
    {
        #region Constructores

        public ProductoSubCategoriasPresentador(IProductoSubCategorias vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        IProductoSubCategorias vista;

        #endregion

        #region Propiedades

        public RepositorioProductoSubCategoria RepositorioProductoSubCategoria
        {
            get { return new RepositorioProductoSubCategoria(); }
        }

        public RepositorioProductoCategoria RepositorioProductoCategoria
        {
            get { return new RepositorioProductoCategoria(); }
        }

        #endregion

        #region Metodos

        public void ActualizarCategorias()
        {
            vista.ListaProductoCategorias = (from item in RepositorioProductoCategoria.DevolverTodos()
                                             orderby item.Nombre ascending
                                             select item).ToList();
        }

        public void ActualizarSubCategorias()
        {
            vista.ListaProductoSubCategorias = (from item in RepositorioProductoSubCategoria.DevolverTodos()
                                                orderby item.Nombre ascending
                                                select item).ToList();
        }

        public void Inicializar()
        {
            ActualizarCategorias();
            ActualizarSubCategorias();
        }

        public void Aceptar()
        {
            if (vista.Nombre.Trim() == String.Empty)
                throw new Exception("El nombre no puede quedar vacio.");
            var productoCategoria = RepositorioProductoCategoria.DevolverPorId(vista.ProductoCategoriaId);
            if (productoCategoria == null)
                throw new Exception("La categoria de producto no puede quedar vacia.");
            switch (vista.Estado)
            {
                case EnumEstado.NUEVO:
                    {
                        ProductoSubCategoria productoSubCategoria = new ProductoSubCategoria();
                        productoSubCategoria.Nombre = vista.Nombre;
                        productoSubCategoria.ProductoCategoria = productoCategoria;
                        RepositorioProductoSubCategoria.Insertar(productoSubCategoria);
                        break;
                    }
                case EnumEstado.MODIFICAR:
                    {
                        if (vista.ProductoSubCategoriaId == (Int32)EnumProductoSubCategorias.PRODUCTOSUBCATEGORIA_POR_DEFECTO)
                            throw new Exception("No se puede modificar una sub categoría por defecto.");
                        ProductoSubCategoria productoSubCategoria = RepositorioProductoSubCategoria.DevolverPorId(vista.ProductoSubCategoriaId);
                        if (productoSubCategoria == null)
                            throw new Exception("La sub categoria de producto no existe.");
                        productoSubCategoria.Nombre = vista.Nombre;
                        productoSubCategoria.ProductoCategoria = productoCategoria;
                        RepositorioProductoSubCategoria.Modificar(productoSubCategoria);
                        break;
                    }
            }
            Inicializar();
        }

        public void Eliminar()
        {
            if (vista.ProductoSubCategoriaId == (Int32)EnumProductoSubCategorias.PRODUCTOSUBCATEGORIA_POR_DEFECTO)
                throw new Exception("No se puede eliminar una sub categoría por defecto.");
            ProductoSubCategoria productoSubCategoria = RepositorioProductoSubCategoria.DevolverPorId(vista.ProductoSubCategoriaId);
            if (productoSubCategoria == null)
                throw new Exception("La sub categoria de producto no existe.");
            RepositorioProductoSubCategoria.ModificarProductos(RepositorioProductoSubCategoria.DevolverPorId(1), productoSubCategoria);
            RepositorioProductoSubCategoria.Eliminar(productoSubCategoria);
            Inicializar();
        }

        public ProductoCategoria TraerProductoCategoriaPorId(Int32 productoCategoriaId)
        {
            ProductoCategoria entidad = RepositorioProductoCategoria.DevolverPorId(productoCategoriaId);
            return entidad;
        }

        #endregion
    }
}
